﻿Public Class Juego
    Dim taminf, tamarq, tamcab, tammag As Integer

    '////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    '////////////////////////////////////////// CONSTRUCCIÓN DE LOS EJÉRCITOS //////////////////////////////////////////////////////
    '//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    'FUNCION PARA AÑADIR TROPAS AL EJERCITO, SIN ORDENAR. LA FUNCION RETORNA EL COSTE PARA RESTAR DEL TOTAL DISPONIBLE
    Public Function CrearUnidad(ByVal unidad As Integer) As Integer
        Select Case (unidad)
            Case Is = 1
                Dim inf As New Infanteria
                jugadoractual.listainf.Add(inf)
                Return inf.Coste
            Case Is = 2
                Dim sarg As New Sargento
                jugadoractual.listainf.Add(sarg)
                Return sarg.Coste
            Case Is = 3
                Dim arq As New Arquero
                jugadoractual.listaarq.Add(arq)
                Return arq.Coste
            Case Is = 4
                Dim mosq As New Mosquetero
                jugadoractual.listaarq.Add(mosq)
                Return mosq.Coste
            Case Is = 5
                Dim cab As New Caballeria
                jugadoractual.listacab.Add(cab)
                Return cab.Coste
            Case Is = 6
                Dim pal As New Paladin
                jugadoractual.listacab.Add(pal)
                Return pal.Coste
            Case Is = 7
                Dim drag As New Dragon
                jugadoractual.listadrag.Add(drag)
                Return drag.Coste
        End Select
        Return 0
    End Function

    'SEPARADA DE LAS TROPAS, ESTA FUNCION ES IGUAL QUE LA ANTERIOR PERO PARA PERSONAJES, LA PRINCIPAL DIFERENCIA ES QUE HAY QUE INDICAR EL NOMBRE
    Public Function CrearPersonaje(ByVal opcion As Integer, ByVal nom As String) As Integer
        Select Case (opcion)
            Case Is = 1
                Dim Camp As New Campeon(nom)
                jugadoractual.listacamp.Add(Camp)
                Return Camp.Coste
            Case Is = 2
                Dim Com As New Comandante(nom)
                jugadoractual.listacamp.Add(Com)
                Return Com.Coste
        End Select
        Return 0
    End Function

    'ESTA FUNCION CREA LOS MAGOS, AÑADIENDO A SU VEZ LOS HECHIZOS QUE SE DESEEN COMPRAR Y DIFERENCIANDOLOS POR SU NOMBRE
    Public Function CrearMago(ByVal nivel As Integer, ByVal nombre As String, ByVal hechizo1 As Integer, ByVal hechizo2 As Integer, ByVal hechizo3 As Integer, ByVal hechizo4 As Integer) As Integer
        Dim costehechizos As Integer
        Dim costetotal As Integer
            Select Case (nivel)
                Case Is = 1
                    Dim mag As New Mago(nombre)
                    If hechizo1 <> 0 Then
                        costehechizos = costehechizos + mag.AñadirHechizo(hechizo1)
                    End If
                    If hechizo2 <> 0 Then
                        costehechizos = costehechizos + mag.AñadirHechizo(hechizo2)
                    End If
                    costetotal = mag.Coste + costehechizos
                jugadoractual.listamago.Add(mag)
                    Return costetotal
                Case Is = 2
                    Dim arch As New Archimago(nombre)
                    If hechizo1 <> 0 Then
                        costehechizos = costehechizos + arch.AñadirHechizo(hechizo1)
                    End If
                    If hechizo2 <> 0 Then
                        costehechizos = costehechizos + arch.AñadirHechizo(hechizo2)
                    End If
                    If hechizo3 <> 0 Then
                        costehechizos = costehechizos + arch.AñadirHechizo(hechizo3)
                    End If
                    If hechizo4 <> 0 Then
                        costehechizos = costehechizos + arch.AñadirHechizo(hechizo4)
                    End If
                    costetotal = arch.Coste + costehechizos
                jugadoractual.listamago.Add(arch)
                    Return costetotal
            End Select
        Return 0
    End Function

    'AHORA ORGANIZAMOS EL EJERCITO, LLAMANDO A LAS DIFERENTES FUNCIONES
    Public Sub OrganizarEjercito(ByVal vueltas As Integer)
        repartirinfanteria()
        repartirarqueros()
        repartircaballeria()
        añadirdragon()
        repartirmagos()
        añadirpersonajes()
        colocarBases()
        DesplegarTropas()
        'recursividad, si vueltas vale 0 o 1 haremos que repita el propio subprograma (asi hacemos todo 2 veces, una para cada jugador)
        vueltas += 1
        If vueltas <= 1 Then
            CambiarJugador()
            OrganizarEjercito(vueltas)
        End If
    End Sub

    'UNA VEZ TENEMOS EL TAMAÑO TOTAL, HACEMOS PAQUETES DE 10 "TAMAÑOS", QUE SERAN LOS DIFERENTES BATALLONES (DE 10 O MENOS MIEMBROS)
    Public Sub repartirinfanteria()
        Dim nombrebat As String
        Dim contador As Integer = 1
        Dim cociente, unidad As Integer
        nombrebat = "Infanteria_" + contador.ToString
        If jugadoractual.listainf.Count <= 0 Then
            Exit Sub
        Else
            taminf = jugadoractual.listainf(0).Tamaño * (jugadoractual.listainf.Count - 1)
        End If
        unidad = jugadoractual.listainf.Count - 10
        cociente = Math.Truncate(taminf / 10)
        For i As Integer = 0 To cociente - 1
            Dim bat As New Batallon
            bat.Nombre = nombrebat
            contador = contador + 1
            If unidad >= 0 Then
                For j = (jugadoractual.listainf.Count - 1) To unidad Step -1
                    bat.Tropas.Add(jugadoractual.listainf(j))
                    jugadoractual.listainf.RemoveAt(j)
                Next
                unidad = jugadoractual.listainf.Count - 10
            End If
            jugadoractual.Batallones.Add(bat)
        Next
        If jugadoractual.listainf.Count > 0 Then
            Dim batresto As New Batallon
            contador += 1
            batresto.Nombre = nombrebat
            For Each inf In jugadoractual.listainf
                batresto.Tropas.Add(inf)
            Next
            jugadoractual.Batallones.Add(batresto)
        End If
    End Sub

    Public Sub repartirarqueros()
        Dim nombrebat As String
        Dim contador As Integer = 1
        Dim cociente, unidad As Integer
        nombrebat = "Arqueros_" + contador.ToString
        If jugadoractual.listaarq.Count <= 0 Then
            Exit Sub
        Else
            tamarq = jugadoractual.listaarq(0).Tamaño * (jugadoractual.listaarq.Count - 1)
        End If
        unidad = jugadoractual.listaarq.Count - 10
        cociente = Math.Truncate(tamarq / 10)
        For i As Integer = 0 To cociente - 1
            Dim bat As New Batallon
            bat.Nombre = nombrebat
            contador = contador + 1
            If unidad >= 0 Then
                For j = (jugadoractual.listaarq.Count - 1) To unidad Step -1
                    bat.Tropas.Add(jugadoractual.listaarq(j))
                    jugadoractual.listaarq.RemoveAt(j)
                Next
                unidad = jugadoractual.listaarq.Count - 10
            End If
            jugadoractual.Batallones.Add(bat)
        Next
        If jugadoractual.listaarq.Count > 0 Then
            Dim batresto As New Batallon
            contador += 1
            batresto.Nombre = nombrebat
            For Each arq In jugadoractual.listaarq
                batresto.Tropas.Add(arq)
            Next
            jugadoractual.Batallones.Add(batresto)
        End If
    End Sub

    Public Sub repartircaballeria()
        Dim nombrebat As String
        Dim contador As Integer = 1
        Dim cociente, unidad As Integer
        nombrebat = "Caballeria_" + contador.ToString
        If jugadoractual.listacab.Count <= 0 Then
            Exit Sub
        Else
            tamcab = jugadoractual.listacab(0).Tamaño * (jugadoractual.listacab.Count - 1)
        End If
        unidad = jugadoractual.listacab.Count - 5
        cociente = Math.Truncate(tamcab / 10)
        For i As Integer = 0 To cociente - 1
            Dim bat As New Batallon
            bat.Nombre = nombrebat
            contador = contador + 1
            If unidad >= 0 Then
                For j = (jugadoractual.listacab.Count - 1) To unidad Step -1
                    bat.Tropas.Add(jugadoractual.listacab(j))
                    jugadoractual.listacab.RemoveAt(j)
                Next
                unidad = jugadoractual.listacab.Count - 5
            End If
            jugadoractual.Batallones.Add(bat)
        Next
        If jugadoractual.listacab.Count > 0 Then
            Dim batresto As New Batallon
            contador += 1
            batresto.Nombre = nombrebat
            For Each inf In jugadoractual.listacab
                batresto.Tropas.Add(inf)
            Next
            jugadoractual.Batallones.Add(batresto)
        End If
    End Sub

    Public Sub añadirdragon()
        Dim nombrebat As String
        Dim contador As Integer = 1
        nombrebat = "Dragon_" + contador.ToString
        If jugadoractual.Equals(Jugador1) Then
            For Each dr In jugadoractual.listadrag
                If dr.GetType = GetType(Dragon) Then
                    Dim bat As New Batallon
                    bat.Nombre = nombrebat
                    bat.Tropas.Add(dr)
                    Jugador1.Batallones.Add(bat)
                End If
            Next
        End If
    End Sub

    'POR ULTIMO SEPARAMOS LOS MAGOS Y LOS PERSONAJES, QUE IRAN SOLOS
    Public Sub repartirmagos()
        For Each m In jugadoractual.listamago
            Dim bat As New Batallon
            bat.Nombre = TryCast(m, Mago).Nombre
            bat.Tropas.Add(m)
            jugadoractual.Batallones.Add(bat)
        Next
    End Sub

    Public Sub añadirpersonajes()
        For Each p In jugadoractual.listacamp
            Dim bat As New Batallon
            bat.Nombre = TryCast(p, Campeon).Nombre
            bat.Tropas.Add(p)
            jugadoractual.Batallones.Add(bat)
        Next
    End Sub

    'UNA VEZ CREADOS LOS BATALLONES, ESTE METODO CREA UNA PICTUREBOX POR CADA BATALLON, ASIGNA EL BATALLON EN SU TAG Y LO AÑADE AL MAPA EN UNA POSICION CERCANA A SU BASE
    Public Sub DesplegarTropas()
        For i As Integer = 0 To jugadoractual.Batallones.Count - 1
            Dim pb As New PictureBox
            Dim pos As Point
            For j As Integer = 0 To miMapa.tamañoMapa - 1
                For h As Integer = 0 To miMapa.tamañoMapa - 1
                    If CalcularAlcance(4, jugadoractual.miEstructura.Coordenadas, miMapa.casillasMapa(j, h).Coordenadas) And miMapa.casillasMapa(i, j).Accesible Then
                        pos = miMapa.casillasMapa(j * 35, h * 35).Coordenadas
                        pb.Location = pos
                    End If
                Next
            Next
            pb.Name = jugadoractual.Batallones(i).Nombre
            pb.Tag = jugadoractual.Batallones(i)
            pb.Size = New Size(20, 20)
            AddHandler pb.MouseClick, AddressOf Seleccionarunidad
            If (jugadoractual.Equals(Jugador1)) Then
                FormJuego.imgUnidades1.Add(pb)
            End If
            If (jugadoractual.Equals(Jugador2)) Then
                FormJuego.imgUnidades2.Add(pb)
            End If
            FormJuego.Controls.Add(pb)
        Next
        FormJuego.AsignarIcono()
        FormJuego.Show()
    End Sub

End Class
